#include <my_header.h>
#include <shadow.h>     // getspnam 函数
#include <syslog.h>     // 包含 LOG_DEBUG 等日志级别宏
#include <time.h>       // 包含 time 相关函数

// 第一个参数命令的名字（字符串，登入是login），第二个是要操作的文件目录
#define LOG_CHECK(opt, arg)                                                                                           \
{                                                                                                                     \
    time_t tmp = time(NULL);                                                                                            \
    char buf[1024] = {0};                                                                                           \
    if (strcmp(opt, "login") == 0) {                                                                                  \
        syslog(LOG_DEBUG, "user: %s login core_file:%s : %d ,time : %s", arg, __FILE__, __LINE__, ctime_r(&tmp, buf));  \
    } else {                                                                                                          \
        syslog(LOG_DEBUG, "cmd: %s dir : %s  core_file:%s : %d , time : %s", opt, arg, __FILE__, __LINE__, ctime_r(&tmp, buf)); \
    }                                                                                                                 \
}

typedef struct tran_s{
    int length;
    char data[4096];
}tran_t;

typedef struct tran_name_s{
    int length;
    int offset;
    char data[4096];
}train_name_t;

typedef struct note_s{
    char* data;
    struct note_s* pnext;
}Note_t;

typedef struct stack_s{
    Note_t* pTop;      // 栈顶
    Note_t* pBottom;      // 栈底
    int stackSize;
}Stack_t;


void onePath(const char* arg, char* onepath, Stack_t* dir);
int cdFunc(const char* arg,  Stack_t* dir);


// login ls的头文件
void get_all_info(char *path, char *result, int ntfd);
void ls_fun(char *arg, int netfd, Stack_t* dir);
int login(int ntfd, char *uname);


int getsTextFunc(const char* arg, int netfd, Stack_t dir);
int putsTextFunc(const char* arg, int netfd, Stack_t dir);
void cutstr(char * input,char *filename);
int isInThisList(char *arg);


int removeFunc(const char* arg, Stack_t dir);
int rmdirFunc(const char* arg, Stack_t dir);
int mkdirFunc(const char* arg, Stack_t dir);


int pwdFunc(Stack_t dir, int netfd);              // 客户端调用，打印当前工作目录

void print_stack(Stack_t dir);
int destroy_stack(Stack_t* dir);    // 摧毁栈
int travel_stack(Stack_t dir, char* working_dir);   // 遍历栈获得当前工作目录
int pop(Stack_t* dir, char* del_data);       // 传入一个256字节大小的字符数组
                                             // 用于存储出栈结点的data值

int push(Stack_t* dir, char* add_data);      // 传入一个字符串，把data数据入栈
bool is_empty(Stack_t dir);      // 栈为空就返回true

void func_error_check(int ret,int netfd);   // 根据ret值向客户端返回错误信息，
                                            //默认ret=-1时代表出错，后面的-2到-n代表其他错误，以第一个设计并发群里的为准

                                            // 通过netfd接收用户名和密码
int recvn(int netfd, void* buf, int length);


